	package dk.muldbjergskolen.gui;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JCheckBox;
import java.awt.Color;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Random;

import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import dk.muldbjergskolen.ctr.LektionCtr;
import dk.muldbjergskolen.ctr.InventarCtr;
import dk.muldbjergskolen.ctr.LektionCtr.LektionEksistererAlleredeException;
import dk.muldbjergskolen.ctr.TidsIntervalCtr;
import dk.muldbjergskolen.model.Ansat;
import dk.muldbjergskolen.model.Inventar;
import dk.muldbjergskolen.model.Klasse;
import dk.muldbjergskolen.model.Lektion;
import dk.muldbjergskolen.model.Lokale;
import dk.muldbjergskolen.model.TidsInterval;
import dk.muldbjergskolen.model.TidsIntervalComparator;
import dk.muldbjergskolen.model.Timer;

import javax.swing.SwingConstants;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.border.TitledBorder;
import javax.swing.UIManager;

public class BookingTab extends JPanel
{
	private JComboBox<String> cbKategori;
	private JComboBox<Lokale> cbLokale;
	private JComboBox<Klasse> cbKlasse;
	private JComboBox<Inventar> cbInventar;
	private JComboBox<String> cbFormaal;
	private JComboBox<Integer> cbUge;
	private JComboBox<Integer> cbAar;
	private JLabel label_mandag;
	private JLabel label_tirsdag;
	private JLabel label_onsdag;
	private JLabel label_torsdag;
	private JLabel label_fredag;
	private JLabel lblLektion1;
	private JLabel lblLektion2;
	private JLabel lblLektion3;
	private JLabel lblLektion4;
	private JLabel lblLektion5;
	private JLabel lblLektion6;
	private JLabel lblLektion7;
	private JCheckBox cb11;
	private JCheckBox cb12;
	private JCheckBox cb13;
	private JCheckBox cb14;
	private JCheckBox cb15;
	private JCheckBox cb16;
	private JCheckBox cb17;
	private JCheckBox cb21;
	private JCheckBox cb22;
	private JCheckBox cb23;
	private JCheckBox cb24;
	private JCheckBox cb25;
	private JCheckBox cb26;
	private JCheckBox cb27;
	private JCheckBox cb31;
	private JCheckBox cb32;
	private JCheckBox cb33;
	private JCheckBox cb34;
	private JCheckBox cb35;
	private JCheckBox cb36;
	private JCheckBox cb37;
	private JCheckBox cb41;
	private JCheckBox cb42;
	private JCheckBox cb43;
	private JCheckBox cb44;
	private JCheckBox cb45;
	private JCheckBox cb46;
	private JCheckBox cb47;
	private JCheckBox cb51;
	private JCheckBox cb52;
	private JCheckBox cb53;
	private JCheckBox cb54;
	private JCheckBox cb55;
	private JCheckBox cb56;
	private JCheckBox cb57;

	private boolean setupDone = false;

	private LektionCtr lC = new LektionCtr();
	
	private InventarCtr iC = new InventarCtr();

	private final Ansat brugerlogin;
	private JLabel lblLokale;
	private JLabel lblKlasse;
	private JLabel lblInventar;

	/**
	 * Create the panel.
	 */
	public BookingTab(final Ansat brugerlogin)
	{
		this.brugerlogin = brugerlogin;

		setLayout(null);

		JPanel panelBookinger = new JPanel();
		panelBookinger.setBorder(new TitledBorder(null, "Bookinger", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelBookinger.setBounds(10, 163, 501, 250);
		add(panelBookinger);
		panelBookinger.setLayout(null);

		label_mandag = new JLabel("Mandag");
		label_mandag.setBounds(96, 11, 60, 14);
		panelBookinger.add(label_mandag);
		label_mandag.setHorizontalAlignment(SwingConstants.CENTER);

		label_tirsdag = new JLabel("Tirsdag");
		label_tirsdag.setBounds(166, 11, 60, 14);
		panelBookinger.add(label_tirsdag);
		label_tirsdag.setHorizontalAlignment(SwingConstants.CENTER);

		label_onsdag = new JLabel("Onsdag");
		label_onsdag.setBounds(236, 11, 60, 14);
		panelBookinger.add(label_onsdag);
		label_onsdag.setHorizontalAlignment(SwingConstants.CENTER);

		label_torsdag = new JLabel("Torsdag");
		label_torsdag.setBounds(306, 11, 60, 14);
		panelBookinger.add(label_torsdag);
		label_torsdag.setHorizontalAlignment(SwingConstants.CENTER);

		label_fredag = new JLabel("Fredag");
		label_fredag.setBounds(387, 11, 60, 14);
		panelBookinger.add(label_fredag);
		label_fredag.setHorizontalAlignment(SwingConstants.CENTER);

		cb11 = new JCheckBox("");
		cb11.setBounds(116, 32, 21, 23);
		panelBookinger.add(cb11);

		cb21 = new JCheckBox("");
		cb21.setBounds(186, 32, 21, 23);
		panelBookinger.add(cb21);

		cb31 = new JCheckBox("");
		cb31.setBounds(256, 32, 21, 23);
		panelBookinger.add(cb31);

		cb41 = new JCheckBox("");
		cb41.setBounds(326, 32, 21, 23);
		panelBookinger.add(cb41);

		cb51 = new JCheckBox("");
		cb51.setBounds(407, 32, 21, 23);
		panelBookinger.add(cb51);

		cb12 = new JCheckBox("");
		cb12.setBounds(116, 58, 21, 23);
		panelBookinger.add(cb12);

		cb22 = new JCheckBox("");
		cb22.setBounds(186, 58, 21, 23);
		panelBookinger.add(cb22);

		cb32 = new JCheckBox("");
		cb32.setBounds(256, 58, 21, 23);
		panelBookinger.add(cb32);

		cb42 = new JCheckBox("");
		cb42.setBounds(326, 58, 21, 23);
		panelBookinger.add(cb42);

		cb52 = new JCheckBox("");
		cb52.setBounds(407, 58, 21, 23);
		panelBookinger.add(cb52);

		cb13 = new JCheckBox("");
		cb13.setBounds(116, 84, 21, 23);
		panelBookinger.add(cb13);

		cb23 = new JCheckBox("");
		cb23.setBounds(186, 84, 21, 23);
		panelBookinger.add(cb23);

		cb33 = new JCheckBox("");
		cb33.setBounds(256, 84, 21, 23);
		panelBookinger.add(cb33);

		cb43 = new JCheckBox("");
		cb43.setBounds(326, 84, 21, 23);
		panelBookinger.add(cb43);

		cb53 = new JCheckBox("");
		cb53.setBounds(407, 84, 21, 23);
		panelBookinger.add(cb53);

		cb14 = new JCheckBox("");
		cb14.setBounds(116, 110, 21, 23);
		panelBookinger.add(cb14);

		cb24 = new JCheckBox("");
		cb24.setBounds(186, 110, 21, 23);
		panelBookinger.add(cb24);

		cb34 = new JCheckBox("");
		cb34.setBounds(256, 110, 21, 23);
		panelBookinger.add(cb34);

		cb44 = new JCheckBox("");
		cb44.setBounds(326, 110, 21, 23);
		panelBookinger.add(cb44);

		cb54 = new JCheckBox("");
		cb54.setBounds(407, 110, 21, 23);
		panelBookinger.add(cb54);

		cb15 = new JCheckBox("");
		cb15.setBounds(116, 136, 21, 23);
		panelBookinger.add(cb15);

		cb25 = new JCheckBox("");
		cb25.setBounds(186, 136, 21, 23);
		panelBookinger.add(cb25);

		cb35 = new JCheckBox("");
		cb35.setBounds(256, 136, 21, 23);
		panelBookinger.add(cb35);

		cb45 = new JCheckBox("");
		cb45.setBounds(326, 136, 21, 23);
		panelBookinger.add(cb45);

		cb55 = new JCheckBox("");
		cb55.setBounds(407, 136, 21, 23);
		panelBookinger.add(cb55);

		cb16 = new JCheckBox("");
		cb16.setBounds(116, 162, 21, 23);
		panelBookinger.add(cb16);

		cb26 = new JCheckBox("");
		cb26.setBounds(186, 162, 21, 23);
		panelBookinger.add(cb26);

		cb36 = new JCheckBox("");
		cb36.setBounds(256, 162, 21, 23);
		panelBookinger.add(cb36);

		cb46 = new JCheckBox("");
		cb46.setBounds(326, 162, 21, 23);
		panelBookinger.add(cb46);

		cb56 = new JCheckBox("");
		cb56.setBounds(407, 162, 21, 23);
		panelBookinger.add(cb56);

		cb17 = new JCheckBox("");
		cb17.setBounds(116, 188, 21, 23);
		panelBookinger.add(cb17);

		cb27 = new JCheckBox("");
		cb27.setBounds(186, 188, 21, 23);
		panelBookinger.add(cb27);

		cb37 = new JCheckBox("");
		cb37.setBounds(256, 188, 21, 23);
		panelBookinger.add(cb37);

		cb47 = new JCheckBox("");
		cb47.setBounds(326, 188, 21, 23);
		panelBookinger.add(cb47);

		cb57 = new JCheckBox("");
		cb57.setBounds(407, 188, 21, 23);
		panelBookinger.add(cb57);

		lblLektion1 = new JLabel("lektion1");
		lblLektion1.setBounds(10, 36, 100, 14);
		panelBookinger.add(lblLektion1);
		lblLektion1.setHorizontalAlignment(SwingConstants.CENTER);

		lblLektion2 = new JLabel("lektion2");
		lblLektion2.setBounds(10, 62, 100, 14);
		panelBookinger.add(lblLektion2);
		lblLektion2.setHorizontalAlignment(SwingConstants.CENTER);

		lblLektion3 = new JLabel("lektion3");
		lblLektion3.setBounds(10, 88, 100, 14);
		panelBookinger.add(lblLektion3);
		lblLektion3.setHorizontalAlignment(SwingConstants.CENTER);

		lblLektion4 = new JLabel("lektion4");
		lblLektion4.setBounds(10, 114, 100, 14);
		panelBookinger.add(lblLektion4);
		lblLektion4.setHorizontalAlignment(SwingConstants.CENTER);

		lblLektion5 = new JLabel("lektion5");
		lblLektion5.setBounds(10, 140, 100, 14);
		panelBookinger.add(lblLektion5);
		lblLektion5.setHorizontalAlignment(SwingConstants.CENTER);

		lblLektion6 = new JLabel("lektion6");
		lblLektion6.setBounds(10, 166, 100, 14);
		panelBookinger.add(lblLektion6);
		lblLektion6.setHorizontalAlignment(SwingConstants.CENTER);

		lblLektion7 = new JLabel("lektion7");
		lblLektion7.setBounds(10, 192, 100, 14);
		panelBookinger.add(lblLektion7);
		lblLektion7.setHorizontalAlignment(SwingConstants.CENTER);

		JButton btnBook = new JButton("BOOK");
		btnBook.setBounds(186, 218, 89, 23);
		panelBookinger.add(btnBook);
		btnBook.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0)
			{
				opretBooking();
			}
		});

		JPanel panelTid = new JPanel();
		panelTid.setLayout(null);
		panelTid.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Tid", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelTid.setBounds(10, 11, 501, 52);
		add(panelTid);

		JLabel lblAar = new JLabel("År:");
		lblAar.setBounds(10, 24, 46, 14);
		panelTid.add(lblAar);

		cbAar = new JComboBox<Integer>();
		cbAar.setBounds(66, 21, 100, 20);
		panelTid.add(cbAar);
		cbAar.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0)
			{
				if (setupDone)
				{
					opdaterDatoLabels();
					setBesatteLektioner();
				}
			}
		});
		cbAar.setModel(new DefaultComboBoxModel<Integer>(new Integer[] { 2011, 2012, 2013, 2014 }));
		cbAar.setToolTipText("");

		JLabel lblUge = new JLabel("Uge:");
		lblUge.setBounds(175, 24, 50, 14);
		panelTid.add(lblUge);

		cbUge = new JComboBox<Integer>();
		cbUge.setBounds(227, 21, 100, 20);
		panelTid.add(cbUge);
		cbUge.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0)
			{
				opdaterDatoLabels();

				if (setupDone)
				{
					opdaterDatoLabels();
					setBesatteLektioner();
				}
			}
		});
		cbUge.setModel(new DefaultComboBoxModel<Integer>(new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
				22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 }));

		JPanel panelOmraade = new JPanel();
		panelOmraade.setLayout(null);
		panelOmraade.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Omr\u00E5de", TitledBorder.LEADING, TitledBorder.TOP,
				null, null));
		panelOmraade.setBounds(10, 70, 501, 82);
		add(panelOmraade);

		JLabel lblKategori = new JLabel("Kategori:");
		lblKategori.setBounds(10, 24, 46, 14);
		panelOmraade.add(lblKategori);

		cbLokale = new JComboBox<Lokale>();
		cbLokale.setBounds(227, 21, 100, 20);
		panelOmraade.add(cbLokale);
		cbLokale.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				if (setupDone)
					setBesatteLektioner();
			}
		});
		cbLokale.setToolTipText("");

		cbKlasse = new JComboBox<Klasse>();
		cbKlasse.setBounds(227, 52, 100, 20);
		panelOmraade.add(cbKlasse);
		cbKlasse.setToolTipText("");

		cbKategori = new JComboBox<String>();
		cbKategori.setBounds(66, 21, 100, 20);
		panelOmraade.add(cbKategori);
		cbKategori.setModel(new DefaultComboBoxModel<String>(new String[] { "Lokaler", "Inventar" }));
		cbKategori.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0)
			{
				if (cbKategori.getSelectedItem().equals("Lokaler"))
				{
					lblInventar.setEnabled(false);
					cbInventar.setEnabled(false);
					lblLokale.setEnabled(true);
					cbLokale.setEnabled(true);
				}
				else if (cbKategori.getSelectedItem().equals("Inventar"))
				{
					lblInventar.setEnabled(true);
					cbInventar.setEnabled(true);
					lblLokale.setEnabled(false);
					cbLokale.setEnabled(false);
				}
			}
		});
		cbKategori.setToolTipText("");

		lblInventar = new JLabel("Inventar:");
		lblInventar.setBounds(336, 24, 50, 14);
		panelOmraade.add(lblInventar);

		lblLokale = new JLabel("Lokale:");
		lblLokale.setBounds(176, 24, 50, 14);
		panelOmraade.add(lblLokale);

		lblKlasse = new JLabel("Klasse:");
		lblKlasse.setBounds(176, 55, 46, 14);
		panelOmraade.add(lblKlasse);

		JLabel lblFormaal = new JLabel("Formål:");
		lblFormaal.setBounds(10, 55, 46, 14);
		panelOmraade.add(lblFormaal);

		cbFormaal = new JComboBox<String>();
		cbFormaal.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0)
			{
				if (cbFormaal.getItemAt(cbFormaal.getSelectedIndex()).equals("Undervisning"))
				{
					cbKlasse.setEnabled(true);
				}
				else
				{
					cbKlasse.setEnabled(false);
				}
			}
		});
		cbFormaal.setBounds(66, 52, 100, 20);
		panelOmraade.add(cbFormaal);
		cbFormaal.setModel(new DefaultComboBoxModel<String>(new String[] { "Undervisning", "Vedligeholdelse", "Andet" }));
		cbFormaal.setToolTipText("");

		cbInventar = new JComboBox<Inventar>();
		cbInventar.setEnabled(false);
		cbInventar.setBounds(387, 21, 100, 20);
		panelOmraade.add(cbInventar);
		cbInventar.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0)
			{
				if (setupDone)
					setBesatteLektioner();
			}
		});

		setup();
	}

	/***
	 * Opdater comboboxes ect. ved startup.
	 */
	private void setup()
	{
		opdaterLokaler();
		opdaterKlasser();
		opdaterTidsIntervaller();
		opdaterDatoLabels();
		opdaterComboboxAar();
		opdaterInventar();

		setBesatteLektioner();

		setupDone = true;
	}

	// Opdaterer ComboBoxen klasser, så den indeholder de klasser der er i databasen.
	private void opdaterKlasser()
	{
		try
		{
			cbKlasse.removeAllItems();
			ArrayList<dk.muldbjergskolen.model.Klasse> a = lC.findKlasser();

			for (int i = 0; i < a.size(); i++)
			{
				cbKlasse.addItem(a.get(i));
			}
		}

		catch (Exception e)
		{
			JOptionPane.showMessageDialog(this, "Ingen klasser blev fundet.");
		}
	}

	// Opdaterer comboboxen så den indeholder de lokaler der i databasen.
	private void opdaterLokaler()
	{
		try
		{
			cbLokale.removeAllItems();
			ArrayList<dk.muldbjergskolen.model.Lokale> lA = lC.findLokaler();

			for (int i = 0; i < lA.size(); i++)
			{
				cbLokale.addItem(lA.get(i));
			}
		}

		catch (Exception e)
		{
			JOptionPane.showMessageDialog(this, "Ingen lokaler blev fundet");
		}
	}

	// Opdaterer comboboxen så den indeholder de inventarer der er i databasen.
	private void opdaterInventar()
	{
		try
		{
			cbInventar.removeAllItems();
			ArrayList<dk.muldbjergskolen.model.Inventar> aI = iC.findInventar();

			for (int i = 0; i < aI.size(); i++)
			{
				cbInventar.addItem(aI.get(i));
			}
		}

		catch (Exception e)
		{
			JOptionPane.showMessageDialog(this, "Ingen inventar blev fundet");
		}
	}

	// Opdaterer tidsintervallerne i booking.
	private void opdaterTidsIntervaller()
	{
		TidsInterval t = null;
		ArrayList<TidsInterval> tA = lC.getTidsIntervaller();
		int i = 0;
		try
		{
			for (i = 0; i < tA.size(); i++)
			{
				t = tA.get(i);

				// Udskriver tiden i formattet: 00:00 til 23:59
				SimpleDateFormat datoFormat = new SimpleDateFormat("HH:mm");

				String startTid = datoFormat.format(t.getStartTid());
				String slutTid = datoFormat.format(t.getSlutTid());

				String separator = " - ";
				if (i == 0)
				{
					lblLektion1.setText(startTid + separator + slutTid);
				}
				else if (i == 1)
				{
					lblLektion2.setText(startTid + separator + slutTid);
				}
				else if (i == 2)
				{
					lblLektion3.setText(startTid + separator + slutTid);
				}
				else if (i == 3)
				{
					lblLektion4.setText(startTid + separator + slutTid);
				}
				else if (i == 4)
				{
					lblLektion5.setText(startTid + separator + slutTid);
				}
				else if (i == 5)
				{
					lblLektion6.setText(startTid + separator + slutTid);
				}
				else if (i == 6)
				{
					lblLektion7.setText(startTid + separator + slutTid);
				}
			}
		}
		catch (Exception e)
		{
			JOptionPane.showMessageDialog(this, "U fucked up!");
		}
	}

	/**
	 * Intern klasse til at repræsentere hver lektion's checkbox.
	 * 
	 * 
	 */
	private static class LektionCheckBox
	{
		public final Date dato;
		public final TidsInterval tidsInterval;
		public final JCheckBox checkBox;
		public final boolean slet;
		public final boolean nyLektion;

		/**
		 * Ny booking valgmulighed.
		 * 
		 * @param dato på lektionen.
		 * @param tidsInterval Lektionens tidsrum.
		 * @param checkBox som repræsenterer en booking valgmulighed.
		 */
		public LektionCheckBox(Date dato, TidsInterval tidsInterval, JCheckBox checkBox, boolean slet, boolean nyLektion)
		{
			this.dato = dato;
			this.tidsInterval = tidsInterval;
			this.checkBox = checkBox;
			this.slet = slet;
			this.nyLektion = nyLektion;
		}
	}

	/**
	 * Returnerer en liste med LektionCheckBox objekter, hvor hvert objekt
	 * indeholder en reference til checkboxen, samt den dato og tidsrum som
	 * checkboxen repræsenterer.
	 * 
	 * @param aar Året.
	 * @param ugeDag Ugen i året.
	 * @return en liste med LektionCheckBox.
	 */
	private ArrayList<LektionCheckBox> getLektionCheckBoxes(int aar, int uge)
	{
		TidsIntervalCtr tCtr = new TidsIntervalCtr();
		ArrayList<TidsInterval> tidsIntervaller = tCtr.getTidsInterval();
		// Sorter tidsintervallerne.
		Collections.sort(tidsIntervaller, new TidsIntervalComparator());

		JCheckBox[][] lektioner = { { cb11, cb12, cb13, cb14, cb15, cb16, cb17 }, // Checkboxes for mandag
				{ cb21, cb22, cb23, cb24, cb25, cb26, cb27 }, // Tirsdag
				{ cb31, cb32, cb33, cb34, cb35, cb36, cb37 }, // Onsdag
				{ cb41, cb42, cb43, cb44, cb45, cb46, cb47 }, // Torsdag
				{ cb51, cb52, cb53, cb54, cb55, cb56, cb57 } }; // Fredag

		ArrayList<LektionCheckBox> lektionCheckBoxes = new ArrayList<LektionCheckBox>();
		// Gå alle ugedagene igennem.
		for (int ugeDag = 0; ugeDag < lektioner.length; ugeDag++)
		{
			// Gå alle tidrummene (tidsintervallerne) igennem.
			for (int tidsrum = 0; tidsrum < lektioner[ugeDag].length; tidsrum++)
			{
				JCheckBox cb = lektioner[ugeDag][tidsrum];
				Date dato = getSelectedDato(aar, uge, ugeDag);
				TidsInterval tid = tidsIntervaller.get(tidsrum);

				boolean slet = false;
				boolean nyLektion = false;
				// CheckBoxen er valgt og er grøn.
				if (cb.isOpaque() && cb.getBackground().equals(Color.GREEN))
				{
					if (!cb.isSelected())
					{
						// En bruger vil ikke længere booke lektionen.
						slet = true;
					}
				}
				// CheckBoxen har ingen synlig baggrundsfarve ELLER den er ikke rød.
				else if (!cb.isOpaque() || !cb.getBackground().equals(Color.RED))
				{
					if (cb.isSelected())
					{
						// Brugeren ønsker at booke lektionen.
						nyLektion = true;
					}
				}

				LektionCheckBox bCb = new LektionCheckBox(dato, tid, lektioner[ugeDag][tidsrum], slet, nyLektion);
				lektionCheckBoxes.add(bCb);
			}
		}

		return lektionCheckBoxes;
	}

	/**
	 * Henter dato ud fra år, uge og ugedag.
	 * 
	 * @param aar År.
	 * @param uge Ugen på året.
	 * @param ugeDag Dagen i ugen (0-4 = man-fre).
	 * @return en dato.
	 */
	private Date getSelectedDato(int aar, int uge, int ugeDag)
	{
		int ugeDage[] = { Calendar.MONDAY, Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.FRIDAY };

		Calendar c = Calendar.getInstance();
		c.setWeekDate(aar, uge, ugeDage[ugeDag]);

		return c.getTime();
	}

	/**
	 * Booker/fjerner lektioner i forhold til valgte checkboxes.
	 */
	private void opretBooking()
	{
		Lokale valgteLokale = null;
		Inventar valgteInventar = null;

		if (cbLokale.isEnabled() && !cbInventar.isEnabled())
		{
			valgteLokale = cbLokale.getItemAt(cbLokale.getSelectedIndex());
		}
		else if (cbInventar.isEnabled() && !cbLokale.isEnabled())
		{
			valgteInventar = cbInventar.getItemAt(cbInventar.getSelectedIndex());
		}
		else
		{
			throw new Error("GUI Fejl: Enten lokale eller inventar skal være enabled.");
		}

		String formaal = cbFormaal.getSelectedItem().toString();

		int aar = (int) cbAar.getSelectedItem();
		int uge = (int) cbUge.getSelectedItem();

		ArrayList<Lektion> nyeLektioner = new ArrayList<>();
		ArrayList<Lektion> sletLektioner = new ArrayList<>();
		for (LektionCheckBox cb : getLektionCheckBoxes(aar, uge))
		{
			if (cb.nyLektion)
			{
				if (valgteLokale != null)
					nyeLektioner.add(new Lektion(cb.dato, cb.tidsInterval, formaal, brugerlogin, valgteLokale));
				else
					nyeLektioner.add(new Lektion(cb.dato, cb.tidsInterval, formaal, brugerlogin, valgteInventar));
			}
			else if (cb.slet)
			{
				if (valgteLokale != null)
					sletLektioner.add(new Lektion(cb.dato, cb.tidsInterval, formaal, brugerlogin, valgteLokale));
				else
					sletLektioner.add(new Lektion(cb.dato, cb.tidsInterval, formaal, brugerlogin, valgteInventar));
			}
		}

		try
		{
			if (sletLektioner.size() > 0)
			{
				lC.sletLektioner(sletLektioner);
			}
			if (nyeLektioner.size() > 0)
			{
				lC.opretLektioner(nyeLektioner);
			}

			String besked = String.format("%s booking(er) gennemført.\n%s booking(er) slettet.", nyeLektioner.size(), sletLektioner.size());

			JOptionPane.showMessageDialog(null, besked, "Succes.", JOptionPane.INFORMATION_MESSAGE);
		}
		catch (LektionEksistererAlleredeException e)
		{
			JOptionPane.showMessageDialog(null, "Valgte lokaler/inventar er allerede booket!", "Fejl!", JOptionPane.ERROR_MESSAGE);
		}
		catch (Exception e)
		{
			JOptionPane.showMessageDialog(null, "Ukendt fejl.", "Fejl!", JOptionPane.ERROR_MESSAGE);
		}

		// Opdater checkboxes.
		setBesatteLektioner();
	}

	/**
	 * Sætter checkboxes til at reflektere besatte lektioner.
	 */
	private void setBesatteLektioner()
	{
		//
		// Hent brugerinput.
		//
		Lokale valgteLokale = null;
		Inventar valgteInventar = null;
		if (cbLokale.isEnabled())
		{
			valgteLokale = cbLokale.getItemAt(cbLokale.getSelectedIndex());
			if (valgteLokale == null)
				return;
		}
		else
		{
			valgteInventar = cbInventar.getItemAt(cbInventar.getSelectedIndex());
			if (valgteInventar == null)
				return;
		}
		int aar = cbAar.getItemAt(cbAar.getSelectedIndex());
		int uge = cbUge.getItemAt(cbUge.getSelectedIndex());

		//
		// Find alle bookinger for et pågældende år og uge.
		//
		LektionCtr bCtr = new LektionCtr();
		Timer t = new Timer(" henter bookinger");
		ArrayList<Lektion> besatteBookinger;
		
		if (valgteLokale != null)
			besatteBookinger = bCtr.findLektioner(getSelectedDato(aar, uge, 0), getSelectedDato(aar, uge, 4), valgteLokale);
		else
			besatteBookinger = bCtr.findLektioner(getSelectedDato(aar, uge, 0), getSelectedDato(aar, uge, 4), valgteInventar);
		
		t.printDuration();

		// Hent alle booking checkboxes.
		ArrayList<LektionCheckBox> bookingCheckBoxes = getLektionCheckBoxes(aar, uge);

		// Løb alle BookingCheckBoxes igennem.
		for (LektionCheckBox lektionCheckBox : bookingCheckBoxes)
		{
			boolean fundet = false;
			boolean egenBooking = false;

			// Løb alle fundne besatte bookinger igennem og check om de stemmer
			// overens med nuværende bookingCheckBox.
			for (Lektion besatBooking : besatteBookinger)
			{
				if (lektionCheckBox.dato.getYear() == besatBooking.getDato().getYear()
						&& lektionCheckBox.dato.getDay() == besatBooking.getDato().getDay()
						&& lektionCheckBox.tidsInterval.getStartTid().getHours() == besatBooking.getTidsInterval().getStartTid().getHours()
						&& lektionCheckBox.tidsInterval.getStartTid().getMinutes() == besatBooking.getTidsInterval().getStartTid().getMinutes())
				{
					lektionCheckBox.checkBox.setSelected(true);

					fundet = true;

					// Check om den nuværende bruger har denne booking.
					if (besatBooking.getBooker().getBrugernavn().equals(brugerlogin.getBrugernavn()))
					{
						egenBooking = true;
					}

					break;
				}
			}

			// Hvis der ingen besatte bookinger blev fundet, så gør den
			// pågældende checkbox tilgængelig for booking.
			if (!fundet)
			{
				lektionCheckBox.checkBox.setSelected(false);
				// Usynliggør baggrundsfarve.
				lektionCheckBox.checkBox.setOpaque(false);
				lektionCheckBox.checkBox.setEnabled(true);
			}
			else
			{
				// Synliggør baggrundsfarve.
				lektionCheckBox.checkBox.setOpaque(true);

				if (egenBooking)
				{
					lektionCheckBox.checkBox.setBackground(Color.GREEN);
					lektionCheckBox.checkBox.setEnabled(true);
				}
				else
				{
					// Hvis bookingen er besat af en anden, så må den ikke kunne
					// ændres.
					lektionCheckBox.checkBox.setBackground(Color.RED);
					lektionCheckBox.checkBox.setEnabled(false);
				}
			}

			// CheckBoxen repainter ikke sig selv ordentligt ved skift af
			// baggrundsfarve. Så det gør vi manuelt.
			lektionCheckBox.checkBox.repaint();
		}
	}

	/***
	 * Opdaterer labels over hver dag i ugen til at reflektere valgte år og uge.
	 */
	private void opdaterDatoLabels()
	{
		// Hent valgte år og uge.
		int year = cbAar.getItemAt(cbAar.getSelectedIndex());
		int week = cbUge.getItemAt(cbUge.getSelectedIndex());
		
		// Sæt dato format.
		SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, MMM d");
		GregorianCalendar cal = new GregorianCalendar();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.WEEK_OF_YEAR, week);
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		Date myDate = null;

		// Array med referencer til labels som skal opdateres.
		JLabel[] labels = { label_mandag, label_tirsdag, label_onsdag, label_torsdag, label_fredag };

		for (int i = 0; i < labels.length; i++)
		{
			cal.set(Calendar.DAY_OF_WEEK, i + 2);
			myDate = cal.getTime();
			labels[i].setText(dateFormat.format(myDate));
		}
	}

	/**
	 * Opdaterer comboboxen der viser årstal til at vise nuværende år, samt året før og året frem.
	 */
	private void opdaterComboboxAar()
	{
		Calendar cal = Calendar.getInstance();

		cbAar.removeAllItems();

		int aarNu = cal.get(Calendar.YEAR);

		// Tilføj året før, året nu, og 1 år frem.
		for (int i = -1; i < 2; i++)
		{
			cbAar.addItem(aarNu + i);
		}

		// Vælg combobox til nuværende år.
		cbAar.setSelectedIndex(1);

		// Sæt comboboxen (uge).
		cbUge.setSelectedIndex(cal.get(Calendar.WEEK_OF_YEAR) - 1);
	}
}
